{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 用管道简化工作流"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.style.use(\"ggplot\")\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载数据\n",
    "df = pd.read_csv(\"http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data\",header=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "      <th>30</th>\n",
       "      <th>31</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>842302</td>\n",
       "      <td>M</td>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>...</td>\n",
       "      <td>25.38</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>842517</td>\n",
       "      <td>M</td>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>...</td>\n",
       "      <td>24.99</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>84300903</td>\n",
       "      <td>M</td>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>...</td>\n",
       "      <td>23.57</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>84348301</td>\n",
       "      <td>M</td>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>...</td>\n",
       "      <td>14.91</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>84358402</td>\n",
       "      <td>M</td>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>...</td>\n",
       "      <td>22.54</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         0  1      2      3       4       5        6        7       8   \\\n",
       "0    842302  M  17.99  10.38  122.80  1001.0  0.11840  0.27760  0.3001   \n",
       "1    842517  M  20.57  17.77  132.90  1326.0  0.08474  0.07864  0.0869   \n",
       "2  84300903  M  19.69  21.25  130.00  1203.0  0.10960  0.15990  0.1974   \n",
       "3  84348301  M  11.42  20.38   77.58   386.1  0.14250  0.28390  0.2414   \n",
       "4  84358402  M  20.29  14.34  135.10  1297.0  0.10030  0.13280  0.1980   \n",
       "\n",
       "        9   ...     22     23      24      25      26      27      28      29  \\\n",
       "0  0.14710  ...  25.38  17.33  184.60  2019.0  0.1622  0.6656  0.7119  0.2654   \n",
       "1  0.07017  ...  24.99  23.41  158.80  1956.0  0.1238  0.1866  0.2416  0.1860   \n",
       "2  0.12790  ...  23.57  25.53  152.50  1709.0  0.1444  0.4245  0.4504  0.2430   \n",
       "3  0.10520  ...  14.91  26.50   98.87   567.7  0.2098  0.8663  0.6869  0.2575   \n",
       "4  0.10430  ...  22.54  16.67  152.20  1575.0  0.1374  0.2050  0.4000  0.1625   \n",
       "\n",
       "       30       31  \n",
       "0  0.4601  0.11890  \n",
       "1  0.2750  0.08902  \n",
       "2  0.3613  0.08758  \n",
       "3  0.6638  0.17300  \n",
       "4  0.2364  0.07678  \n",
       "\n",
       "[5 rows x 32 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "M=恶性，B=良性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 做基本的数据预处理\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n",
    "X = df.iloc[:,2:].values\n",
    "y = df.iloc[:,1].values\n",
    "le = LabelEncoder()    #将M-B等字符串编码成计算机能识别的0-1\n",
    "y = le.fit_transform(y)\n",
    "le.transform(['M','B'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据切分8：2\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y,random_state=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Accuracy: 0.956\n"
     ]
    }
   ],
   "source": [
    "# 把所有的操作全部封在一个管道pipeline内形成一个工作流：\n",
    "## 标准化+PCA+逻辑回归\n",
    "\n",
    "\n",
    "### 方式1：make_pipeline\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.pipeline import make_pipeline\n",
    "\n",
    "pipe_lr1 = make_pipeline(StandardScaler(),PCA(n_components=2),LogisticRegression(random_state=1))\n",
    "pipe_lr1.fit(X_train,y_train)\n",
    "y_pred1 = pipe_lr.predict(X_test)\n",
    "print(\"Test Accuracy: %.3f\"% pipe_lr1.score(X_test,y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Accuracy: 0.956\n"
     ]
    }
   ],
   "source": [
    "# 把所有的操作全部封在一个管道pipeline内形成一个工作流：\n",
    "## 标准化+PCA+逻辑回归\n",
    "\n",
    "\n",
    "### 方式2：Pipeline\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "pipe_lr2 = Pipeline([['std',StandardScaler()],['pca',PCA(n_components=2)],['lr',LogisticRegression(random_state=1)]])\n",
    "pipe_lr2.fit(X_train,y_train)\n",
    "y_pred2 = pipe_lr2.predict(X_test)\n",
    "print(\"Test Accuracy: %.3f\"% pipe_lr2.score(X_test,y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 使用k折交叉验证评估模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CV accuracy scores:[0.93478261 0.93478261 0.95652174 0.95652174 0.93478261 0.95555556\n",
      " 0.97777778 0.93333333 0.95555556 0.95555556]\n",
      "CV accuracy:0.950 +/-0.014\n"
     ]
    }
   ],
   "source": [
    "# 评估方式1：k折交叉验证\n",
    "\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "scores1 = cross_val_score(estimator=pipe_lr,X = X_train,y = y_train,cv=10,n_jobs=1)\n",
    "print(\"CV accuracy scores:%s\" % scores1)\n",
    "print(\"CV accuracy:%.3f +/-%.3f\"%(np.mean(scores1),np.std(scores1)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fold: 1,Class dist.:[256 153],Acc:0.935\n",
      "Fold: 2,Class dist.:[256 153],Acc:0.935\n",
      "Fold: 3,Class dist.:[256 153],Acc:0.957\n",
      "Fold: 4,Class dist.:[256 153],Acc:0.957\n",
      "Fold: 5,Class dist.:[256 153],Acc:0.935\n",
      "Fold: 6,Class dist.:[257 153],Acc:0.956\n",
      "Fold: 7,Class dist.:[257 153],Acc:0.978\n",
      "Fold: 8,Class dist.:[257 153],Acc:0.933\n",
      "Fold: 9,Class dist.:[257 153],Acc:0.956\n",
      "Fold:10,Class dist.:[257 153],Acc:0.956\n",
      "\n",
      "CV accuracy :0.950 +/-0.014\n"
     ]
    }
   ],
   "source": [
    "# 评估方式2：分层k折交叉验证\n",
    "\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "kfold = StratifiedKFold(n_splits=10,random_state=1).split(X_train,y_train)\n",
    "scores2 = []\n",
    "for k,(train,test) in enumerate(kfold):\n",
    "    pipe_lr.fit(X_train[train],y_train[train])\n",
    "    score = pipe_lr.score(X_train[test],y_train[test])\n",
    "    scores2.append(score)\n",
    "    print('Fold:%2d,Class dist.:%s,Acc:%.3f'%(k+1,np.bincount(y_train[train]),score))\n",
    "print('\\nCV accuracy :%.3f +/-%.3f'%(np.mean(scores2),np.std(scores2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 使用学习和验证曲线调试算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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JLIu3+HDh1m2bBlvvvkmmZmZPPTQQ7jdbjRNixsO21qZ0WMwml9H9HWvWLGCXr168fbbb6OqKoMGDQqXG+98U6dO5dlnn+Xaa69l1KhRLUS2I0lKdJaqqqxcuZLvf//7/OxnP2Pz5s0cOXIkJs+6desYN24czzzzDA899FD4ySA9PZ1HHnmEJUuWMHv2bJ5//vmY4+bOncvixYtZvHixCIggdCBGI6xeXcWyZTXMm1fPsmU159WpDtCjRw8aGxtb3V9fX09GRgY2m419+/bx4Ycftv1krXDVVVfxxhtvALBx40ZOnz4d147U1FR69uzJyZMneeeddwAYPHgwJ06coKysDICGhgb8fj9FRUW8/PLL+P1+gHBzVv/+/dm9ezdAeCnweNTV1dG7d28MBgPr1q0LC951113HH/7wB1wuV0y5KSkpTJw4kUceeYTbb7/9vO/JuZAUTJIktgAAGrJJREFUEdm3bx85OTlkZ2djMpkYP34827dvj8mjKEq4E6mpqSnspl166aVhVc3NzcXn8+Hz+ZJhtiAIzTAa4frrPTz0UAPXX+85LwEBvY/iyiuvZNKkSTz55JMt9k+cOJFAIEBJSQnPPPMMY8aMOb8TxuG73/0uGzdu5POf/zzr168nOzubHj16xOQZMWIEo0aNori4mO9+97vhTm6LxcKLL77I/PnzKSkp4Y477sDj8TB9+nT69etHSUkJJSUl/O///m/4XE888QRf+tKXzhh5ds8997B27VpuuukmDhw4EPZSiouLmTJlCl/4whe4/vrr+eUvfxk+5ktf+hKKonDddde19y06I0lZY/3999+nrKyMb33rWwBs2rSJiooKZs2aFc5TU1PDU089RWNjIx6Ph8cffzzswkWX8/bbb/P4448DenNWfX09BoOBsWPHcuutt8Z19UpLSyktLQVg0aJFeL3eDrlOk8kUfvLoynQHO8XG9uFsNp44cSKmKehixOPxYDQaMZlMbN++nUceeYT169d3tlnnzLJly6irq+PRRx8977I8Hg/Z2dkxaaFug+YkpU8knk41r+w3b97MxIkTufnmm9m7dy/PP/88S5YswWDQnaVPP/2U3//+9/zgBz8IHzN37lwcDgcul4slS5awadOmuCocehoI0VEL2WdlZXVY2e1Jd7BTbGwfzmZjqALtTDpbjD/55BO+9a1voaoqFouFZ555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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用学习曲线诊断偏差与方差\n",
    "from sklearn.model_selection import learning_curve\n",
    "\n",
    "pipe_lr3 = make_pipeline(StandardScaler(),LogisticRegression(random_state=1,penalty='l2'))\n",
    "train_sizes,train_scores,test_scores = learning_curve(estimator=pipe_lr3,X=X_train,y=y_train,train_sizes=np.linspace(0.1,1,10),cv=10,n_jobs=1)\n",
    "train_mean = np.mean(train_scores,axis=1)\n",
    "train_std = np.std(train_scores,axis=1)\n",
    "test_mean = np.mean(test_scores,axis=1)\n",
    "test_std = np.std(test_scores,axis=1)\n",
    "plt.plot(train_sizes,train_mean,color='blue',marker='o',markersize=5,label='training accuracy')\n",
    "plt.fill_between(train_sizes,train_mean+train_std,train_mean-train_std,alpha=0.15,color='blue')\n",
    "plt.plot(train_sizes,test_mean,color='red',marker='s',markersize=5,label='validation accuracy')\n",
    "plt.fill_between(train_sizes,test_mean+test_std,test_mean-test_std,alpha=0.15,color='red')\n",
    "plt.xlabel(\"Number of training samples\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.legend(loc='lower right')\n",
    "plt.ylim([0.8,1.02])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mTx5MjNmzGDs2LEA3H777Vx11VWkp6ezbt0637EjRoyguLiYI0eOcPnll/Pggw+Snp7OzTffjMPhAOD+++/nX//6l2//5557jvHjxzN27Fhfie6ioiKmTJnC+PHjeeihh7jooovqLbX9yCOP8Ktf/Yr09HSee+453/qcnByuvfZaMjIymDhxIhUVFSiKwhNPPMHYsWPJyMhg9erVAW0G+Pbbb5k8eTIAixYt4qGHHuLmm2/mvvvu48iRI1x33XWMHz+e8ePHs2vXLt/1li9f7jvv008/zcGDBxk/frxv+4EDB7jqqqua/k85Q0RYhkAgAODPf+5Ebm7DQSN2u4G9e02oqu50rayUyM4OY9y4LsTH1x/NM2iQhyeeKGvwnHPmzOGnn37iww8/BCA7O5ucnBy2bt1KcnIygK9MtsPhYOLEiUyYMKFOFdNffvmFZcuWsXDhQu6++27ef/99brjhhjrXs1gs/Oc//+Fvf/sby5cvZ+HChTz//POMGjWKzMxMPvroI95444162/rwww8THx+Poij85je/ITc3l379+vH73/+eFStWMGzYMMrLy4mIiGDdunUcOXKE//znP5hMpkZVRP3uu+/YvHkzkZGROBwONmzYQEREBAcOHGDGjBn8+9//ZuvWrXzwwQf861//IjIyErvdTnx8PLGxsezevZshQ4awceNGbrrpptNer7kQIiIQCBpFZaVE7chPVdXX16p2fVYMGzbMJyAAq1ev5t///jeg1wL65Zdf6ohIUlISQ4YMAWDo0KEcOXKk3nP/6le/8u3zwQcfALBz505WrVoFQHp6Op0byEKxZcsW3njjDRRF4cSJE+zbtw9JkujatSvDhg0DIDY2FoDPPvuMadOm+cKna5cDr49x48b55mZ4PB4effRRcnNzMRgMHDhwAIBPP/2U3/zmN779vOedOnUqb731FgMHDmTLli2+0Vdr0GoikpOTw5o1a1BVlbFjxzJp0qSA7YWFhSxbtozKykpUVWXq1Kmcf/75fPfdd7zxxhvIsozJZGLatGm+L8tjjz2G3W4nrLqK4Ny5c09rIxUIBPVzqhED6L6QGTPiqaysCf+MitJ48slSrryy+WZ+R0VF+d5nZ2fz6aefsmXLFiIjI5k8eXK9s67Dw8N9741GI06ns95ze/czGo0+n0tj6vIdPnzYV3m1c+fO3H///TidTjRN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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用验证曲线解决欠拟合和过拟合\n",
    "from sklearn.model_selection import validation_curve\n",
    "\n",
    "pipe_lr3 = make_pipeline(StandardScaler(),LogisticRegression(random_state=1,penalty='l2'))\n",
    "param_range = [0.001,0.01,0.1,1.0,10.0,100.0]\n",
    "train_scores,test_scores = validation_curve(estimator=pipe_lr3,X=X_train,y=y_train,param_name='logisticregression__C',param_range=param_range,cv=10,n_jobs=1)\n",
    "train_mean = np.mean(train_scores,axis=1)\n",
    "train_std = np.std(train_scores,axis=1)\n",
    "test_mean = np.mean(test_scores,axis=1)\n",
    "test_std = np.std(test_scores,axis=1)\n",
    "plt.plot(param_range,train_mean,color='blue',marker='o',markersize=5,label='training accuracy')\n",
    "plt.fill_between(param_range,train_mean+train_std,train_mean-train_std,alpha=0.15,color='blue')\n",
    "plt.plot(param_range,test_mean,color='red',marker='s',markersize=5,label='validation accuracy')\n",
    "plt.fill_between(param_range,test_mean+test_std,test_mean-test_std,alpha=0.15,color='red')\n",
    "plt.xscale('log')\n",
    "plt.xlabel(\"Parameter C\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.legend(loc='lower right')\n",
    "plt.ylim([0.8,1.02])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 通过网格搜索进行超参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "网格搜索经历时间：11.719 S\n",
      "0.9846859903381642\n",
      "{'svc__C': 100.0, 'svc__gamma': 0.001, 'svc__kernel': 'rbf'}\n"
     ]
    }
   ],
   "source": [
    "# 方式1：网格搜索GridSearchCV()\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.svm import SVC\n",
    "import time\n",
    "\n",
    "start_time = time.time()\n",
    "pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))\n",
    "param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]\n",
    "param_grid = [{'svc__C':param_range,'svc__kernel':['linear']},{'svc__C':param_range,'svc__gamma':param_range,'svc__kernel':['rbf']}]\n",
    "gs = GridSearchCV(estimator=pipe_svc,param_grid=param_grid,scoring='accuracy',cv=10,n_jobs=-1)\n",
    "gs = gs.fit(X_train,y_train)\n",
    "end_time = time.time()\n",
    "print(\"网格搜索经历时间：%.3f S\" % float(end_time-start_time))\n",
    "print(gs.best_score_)\n",
    "print(gs.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "随机网格搜索经历时间：1.082 S\n",
      "0.9802415458937197\n",
      "{'svc__kernel': 'linear', 'svc__C': 0.1}\n"
     ]
    }
   ],
   "source": [
    "# 方式2：随机网格搜索RandomizedSearchCV()\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "from sklearn.svm import SVC\n",
    "import time\n",
    "\n",
    "start_time = time.time()\n",
    "pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))\n",
    "param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]\n",
    "param_grid = [{'svc__C':param_range,'svc__kernel':['linear']},{'svc__C':param_range,'svc__gamma':param_range,'svc__kernel':['rbf']}]\n",
    "# param_grid = [{'svc__C':param_range,'svc__kernel':['linear','rbf'],'svc__gamma':param_range}]\n",
    "gs = RandomizedSearchCV(estimator=pipe_svc, param_distributions=param_grid,scoring='accuracy',cv=10,n_jobs=-1)\n",
    "gs = gs.fit(X_train,y_train)\n",
    "end_time = time.time()\n",
    "print(\"随机网格搜索经历时间：%.3f S\" % float(end_time-start_time))\n",
    "print(gs.best_score_)\n",
    "print(gs.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy: 0.974\n"
     ]
    }
   ],
   "source": [
    "## 我们可以把最佳模型调用出来\n",
    "clf = gs.best_estimator_\n",
    "clf.fit(X_train,y_train)\n",
    "print('Test accuracy: %.3f'% clf.score(X_test,y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "嵌套交叉验证：5.113 S\n",
      "CV accuracy :0.974 +/-0.015\n"
     ]
    }
   ],
   "source": [
    "# 方式3：嵌套交叉验证\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import cross_val_score\n",
    "import time\n",
    "\n",
    "start_time = time.time()\n",
    "pipe_svc = make_pipeline(StandardScaler(),SVC(random_state=1))\n",
    "param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]\n",
    "param_grid = [{'svc__C':param_range,'svc__kernel':['linear']},{'svc__C':param_range,'svc__gamma':param_range,'svc__kernel':['rbf']}]\n",
    "gs = GridSearchCV(estimator=pipe_svc, param_grid=param_grid,scoring='accuracy',cv=2,n_jobs=-1)\n",
    "scores = cross_val_score(gs,X_train,y_train,scoring='accuracy',cv=5)\n",
    "end_time = time.time()\n",
    "print(\"嵌套交叉验证：%.3f S\" % float(end_time-start_time))\n",
    "print('CV accuracy :%.3f +/-%.3f'%(np.mean(scores),np.std(scores)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 比较不同的性能评估指标"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "                                                       混淆矩阵\n",
    "$$ 1.误差率ERR = \\frac{FP+FN}{FP+FN+TP+TN}\\\\\n",
    "   2.准确率ACC = \\frac{TP+TN}{FP+FN+TP+TN}\\\\\n",
    "   3.假阳率FPR = \\frac{FP}{N} = \\frac{FP}{FP+TN}\\\\\n",
    "   4.真阳率TPR = \\frac{TP}{P} = \\frac{TP}{FN+TP}\\\\\n",
    "   5.精度PRE = \\frac{TP}{TP+FP}\\\\\n",
    "   6.召回率REC=TPR=\\frac{TP}{P} = \\frac{TP}{FN+TP}\\\\\n",
    "   7.F1-score = 2\\frac{PRE\\times REC}{PRE+REC}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 180x180 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制混淆矩阵\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "pipe_svc.fit(X_train,y_train)\n",
    "y_pred = pipe_svc.predict(X_test)\n",
    "confmat = confusion_matrix(y_true=y_test,y_pred=y_pred)\n",
    "fig,ax = plt.subplots(figsize=(2.5,2.5))\n",
    "ax.matshow(confmat, cmap=plt.cm.Blues,alpha=0.3)\n",
    "for i in range(confmat.shape[0]):\n",
    "    for j in range(confmat.shape[1]):\n",
    "        ax.text(x=j,y=i,s=confmat[i,j],va='center',ha='center')\n",
    "plt.xlabel('predicted label')\n",
    "plt.ylabel('true label')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision:0.976\n",
      "recall_score:0.952\n",
      "f1_score:0.964\n"
     ]
    }
   ],
   "source": [
    "# 各种指标的计算\n",
    "from sklearn.metrics import precision_score,recall_score,f1_score\n",
    "\n",
    "print('Precision:%.3f'%precision_score(y_true=y_test,y_pred=y_pred))\n",
    "print('recall_score:%.3f'%recall_score(y_true=y_test,y_pred=y_pred))\n",
    "print('f1_score:%.3f'%f1_score(y_true=y_test,y_pred=y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9880771478667446\n",
      "{'svc__C': 100.0, 'svc__gamma': 0.001, 'svc__kernel': 'rbf'}\n"
     ]
    }
   ],
   "source": [
    "# 将不同的指标与GridSearch结合\n",
    "from sklearn.metrics import make_scorer,f1_score\n",
    "scorer = make_scorer(f1_score,pos_label=0)\n",
    "gs = GridSearchCV(estimator=pipe_svc,param_grid=param_grid,scoring=scorer,cv=10)\n",
    "gs = gs.fit(X_train,y_train)\n",
    "print(gs.best_score_)\n",
    "print(gs.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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+bptsrKyFFtbW2X58uWKoijK77//rgDKhQsXdNvEx8cr1tbWytChQx9Zz+TJkxVXV1clOTk5z8cftNGRI0d06w4ePKgAytmzZx+53wULFije3t665adto8d9FhVFUdRqtbJmzRq9dc/yvk2dOlXx8vLSq+e/79G/GfIerly5UrG0tFSuX7/+yP0I4yld08RKsebNm7Nu3TrS09P5/vvv2bVrF9OnT9c9furUKdLS0njttdf0hpdycnJIT0/nzp07uiHDvIY4IfdbeWZmJhUrVtRbn5mZSbVq1fJ8jpmZGf379+ebb77h/fffB+Cbb76hf//+ut5rREQEhw4dYunSpQ89/8KFCzRs2BCAWrVqYWdnl287nDp1itq1a+udC3J1daVGjRqcOnVKb9uWLVvq/u3g4ECtWrU4ffq0rqaLFy8+dLz09HRd7+zBvp977jm9be7cucPUqVMJDQ3l1q1bZGdnk56erjds9yQevH7InUji6upKbGwskNsjcnZ21hvqc3R0pEaNGvnu88iRI7Rq1QpbW9tHbqNSqWjQoIFu+cH7Hhsbq9v/ihUrWLlyJVeuXCElJYXs7Gy0Wq3efp6mjR73WXyUZ3nf/mvMmDEMHz6c7du3065dOzp37oyvr+8T1XPkyBFq166t61kK05JALCWsra11fxTr1q3L+fPnGTlypO5cxYM/Ups2baJ69eoPPd/R0fGxx9BqtZQtW5aIiIiHHrOwsHjk8wYNGsSnn37KkSNHsLS05Pjx46xbt05vv++//z4DBgx46Llubm66f+f3x/vf/h34DyiKkuf6/27z75oGDBjABx988NB2Tk5O+db0xhtvcO3aNebOnUuVKlWwtramT58+ekO2T+K/batSqfRC53Gv61Ee9zwzMzO9IfcH2//7szRy5Ehmz56Nn58f9vb2bNq0iQ8//FBvP8Zoowee5X37r8GDB9OpUyd27NjBnj17eOmll+jevfsTX1L0tO+PKHgSiKVUcHAwderUITAwEB8fH93kkcuXLxMQEJDncxo3bgzA77//nudlEz4+PiQmJpKenk7dunUNrqVOnTo0btyYr7/+GktLSxo2bEj9+vX19nvq1KlnvgbswbGWL19OXFycrpcYGxvL+fPnGT9+vN62hw4dokOHDgAkJiZy9uxZhg8frqvp77//xsvL64n/oIWHhzN37ly6du0KQEpK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b9WTc4Wi1NNqtU8VhkI8C41GU6C9ZvkEG0BRFN57by8bNpwDoFGj8ixc6CtDpEL8P7msSJhKQX72pGtjAJVKRZkyFlhaqpkypTk//9xFwlCIIsbT05MXXniBDh06MGjQIO7du6d77Ny5c/Ts2ZM2bdrQunVrFi5cqHezjNDQUF566SX8/Pzw9fVl2rRppngJ+YqMjGT8+PGmLuOREhIS6NGjB9WqVePDDz985HZ3796lT58+tG7dmj59+pCYmAjkdjymTJlC69at8ff3JzIyEoD4+Hj69+9vlNcggfgIiYkZnDz5z4/2Tpjgw++/v8qIEfVRq6XZhChqrKys2LVrF6GhoZQrV461a9cCkJaWxuDBgxk1ahT79u0jJCSEI0eOsG7dOgDOnj3L5MmTWbJkCWFhYYSGhvLcc88VaG3Z2dnPvI/FixczePBgox7zSVhZWTFhwgSmTJmS73aff/45bdq0Yf/+/bRp04bPP/8cyP1SEhUVxb59+5gzZw4TJ04EwMnJifLlyxMREVHor0H+sufh99+v0qHDDwwevJP79zMBsLbW4O1dzsSVCSEM0aRJE27dugXAli1b8PHxwc/PDwBra2s++eQTli5dCsCyZct499138fb2BnLPS73xxhsP7TMlJYWgoCCef/55/P392bZtGwDVqlXTbfPrr78yZswYAMaMGUNwcDA9evRg+vTpNG/eXK/X2rp1a+7cuUN8fDzDhg0jICCAgICAPP/wJycnc/r0aerUqQPAsWPH6Nq1Kx07dqRr165cvHgRgI0bN/LWW28xaNAg+vbtC8AXX3xBQEAA/v7+zJs3T7fPIUOG0KlTJ9q3b8/69eufopX12djY0KxZMywtLfPdbufOnfTs2ROAnj17smPHDt36Hj16oFKpaNKkCffu3SM2NhaATp068dNPPz1zjY9jtHOIx48fZ82aNWi1Wp5//nm6deum93hWVhZLly7l8uXLlClThjFjxlC+fHljlQfA3bvpTJ16kB9/zP1wNW3qSlJSpswgFeIJuG+oWCj7je5706DtcnJy2Ldvny4Qzp07R/369fW2qVy5Mqmpqdy/f59z584xfPjwx+530aJFlClTht27dwPohvryc/nyZTZu3IharUZRFHbs2EHv3r05evQoHh4euLi4MHLkSIYNG0azZs24efMm/fr1IywsTG8/J06coGbNmrpl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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制ROC曲线\n",
    "from sklearn.metrics import roc_curve,auc\n",
    "from sklearn.metrics import make_scorer,f1_score\n",
    "scorer = make_scorer(f1_score,pos_label=0)\n",
    "gs = GridSearchCV(estimator=pipe_svc,param_grid=param_grid,scoring=scorer,cv=10)\n",
    "y_pred = gs.fit(X_train,y_train).decision_function(X_test)\n",
    "#y_pred = gs.predict(X_test)\n",
    "fpr,tpr,threshold = roc_curve(y_test, y_pred) ###计算真阳率和假阳率\n",
    "roc_auc = auc(fpr,tpr) ###计算auc的值\n",
    "plt.figure()\n",
    "lw = 2\n",
    "plt.figure(figsize=(7,5))\n",
    "plt.plot(fpr, tpr, color='darkorange',\n",
    "         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假阳率为横坐标，真阳率为纵坐标做曲线\n",
    "plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
    "plt.xlim([-0.05, 1.0])\n",
    "plt.ylim([-0.05, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic ')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
